练习

  (1)下面的代码存在什么错误?

        public sealed class MyClass
        {
            // Class members.
        }

        public class myDerivedClass : MyClass
        {
            // Class members.
        }

答案:myDerivedClass派生于MyClass,但是MyClass是密封的,不能从MyClass中派生其他类。

  (2)如何定义不能创建的类(noncreatable class)?

答案:要定义不能创建的类,可以将其定义为静态类,或者将其所有构造函数定义为私有。

  (3)为什么不能创建的类仍旧有用?如何利用它们的功能?

  不能创建的类可以通过它们拥有的静态成员来使用。实际上,甚至可以通过这些成员获取这些类的实例,如下所示:

    class CreateMe
    {
        private CreateMe()
        {}

        static public CreateMe GetCreateMe()
        {
            return new CreateMe();
        }
    }

  这里,公共函数可以访问私有构造函数,因为它在同一个类的定义中。

  (4)在类库项目 Vehicles 中编写代码,实现本章前面讨论的 Vehicle 对象系列,其中有 9 个对象和 2 个接口需要实现。

答案:   为简单起见,下面的类定义显示为一个代码文件的一部分,而没有给每个类定义列出单独的代码文件:

    namespace Vehicles
    {
        public abstract class Vehicle {}

        public abstract class Car : Vehicle {}

        public abstract class Train : Vehicle {}

        public interface IPassengerCarrier {}

        public interface IHeavyLoadCarrier {}

        public class SUV : Car, IPassengerCarrier {}

        public class Pickup : Car, IPassengerCarrier, IHeavyLoadCarrier {}

        public class Compact : Car, IPassengerCarrier {}

        public class PassengerTrain : Train, IPassengerCarrier {}

        public class FreightTrain : Train, IHeavyLoadCarrier {}

        public class T424DoubleBogey : Train, IHeavyLoadCarrier {}
    }

  (5)创建一个控制台应用程序项目 Traffic,它引用 Vehicle.dll(在第(4)题中创建),其中包括函数 AddPassenger(),它接受任何带有 IPassengerCarrier 接口的对象。要证明代码可以运行,使用支持这个接口的每个对象实例调用该函数,在每个对象上调用派生于 System.Object 的 ToString() 方法,并将结果输出到屏幕上。

答案:

    using System;
    using Vehicles;

    namespace Traffic
    {
        class Program
        {
            static void Main(string[] args)
            {
                AddPassenger(new Compact());
                AddPassenger(new SUV());
                AddPassenger(new Pickup());
                AddPassenger(new PassengerTrain());
            }

            static void AddPassenger(IPassengerCarrier Vehicle)
            {
                Console.WriteLine(Vehicle.ToString());
            }
        }
    }

🔚